home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DS-CD ROM 2 1993 August
/
DS CD-ROM 2.Ausgabe (August 1993).iso
/
programm
/
ds0257
/
demo.exe
/
ENV.DEM
< prev
next >
Wrap
Text File
|
1992-02-16
|
15KB
|
500 lines
; ----------------------------
; ENV.DEM - Demoprogramm für die Routinen aus ENV.LIB
; (für den A86)
;
; (c) Bernd Schemmer 1990 - 1992
; Letzter Update: 15.02.1992
;
; Übersetzen:
; A86 ENV.DEM DEMOS.INC TO ENV.COM
;
; Hinweis: Die Environment-Variable 'A86' muß den Dateinamen 'MACROS.MAC'
; enthalten und die .LIB-Dateien müssen über die Datei A86.LIB
; erreichbar sein.
;
; ---------------------------
jmp start ; Daten überspringen
; ---------------------------
; Meldungen
;
logo db CR,LF
db 'ENV.DEM - Demoprogramm für die Routinen aus ENV.LIB'
db CR,LF
db '---------------------------------------------------'
db CR,LF,CR,LF
GETLENGTH logo
; Meldung, falls das Programm vom COMMAND.COM
; aufgerufen wurde
MakeMsg1 _CommandMsg, '(Kommando-Interpreter)'
MakeMsg _ReleaseEnv, CR,LF, 'Gebe lokales Environment frei.'
MakeMsg _ComspecMSG, CR,LF, 'Ermittle den Wert von COMSPEC im akt. Environment'
; ---------------------------
; Maske für die Daten des lokalen Environments
;
_LokalEnvMSG db 'Daten des lokalen Environments:'
db CR,LF
db '-------------------------------'
db CR,LF
db '(Segment-Adresse: '
_LokalEnvSeg db '????h, Länge: '
_LokalEnvLength db '?????, Belegt: '
_LokalEnvUsed db '?????, Frei: '
_LokalEnvFree db '?????)'
db CR,LF
db '---- Der Programm-Name ist: '
_ProgName db 65 dup ' '
db CR,LF
db '---- Anzahl Einträge im Environment: '
_LokalEnvCount db '???'
db CR,LF
db '---- Einträge: '
db CR,LF
GETLENGTH _LokalEnvMSG
; ---------------------------
; Maske für die Daten des Environments des aufrufenden Programmes
;
_CallerEnvMSG db CR,LF
db 'Daten des Environments des aufrufenden Programmes:'
db CR,LF
db '--------------------------------------------------'
db CR,LF
db '(Segment-Adresse: '
_CallerEnvSeg db '????h, Länge: '
_CallerEnvLength db '?????, Belegt: '
_CallerEnvUsed db '?????, Frei: '
_CallerEnvFree db '?????)'
db CR,LF
db '---- Der Name des aufrufenden Programmes ist: '
_CallerName db 80 dup ' '
db CR,LF
db '---- Anzahl Einträge im Environment: '
_CallerEnvCount db '???'
db CR,LF
db '---- Einträge: '
db CR,LF
GETLENGTH _CallerEnvMSG
; ---------------------------
; Maske für die Daten des Master-Environments des COMMAND.COM
;
_CommandEnvMSG db CR,LF
db 'Daten des Master-Environments des Kommando-Interpreters:'
db CR,LF
db '--------------------------------------------------------'
db CR,LF
db '(Segment-Adresse: '
_CommandEnvSeg db '????h, Länge: '
_CommandEnvLength db '?????, Belegt: '
_CommandEnvUsed db '?????, Frei: '
_CommandEnvFree db '?????)'
db CR,LF
db '---- Anzahl Einträge im Environment: '
_CommandEnvCount db '???'
db CR,LF
db '---- Einträge: '
db CR,LF
GETLENGTH _CommandEnvMSG
; ---------------------------
; Fehlermeldungen
;
MakeMsg _LokalError, 'Fehler: Daten des lokalen Environments nicht ermittelbar!'
MakeMsg _CallerError, 'Fehler: Daten des Environments des Aufrufers nicht ermittelbar!'
MakeMsg _CommandError, 'Fehler: Daten des Master-Environments des COMMAND.COM nicht ermittelbar!'
MakeMsg _ReleaseError, 'Fehler: Lokales Environment konnte nicht freigegeben werden!'
MakeMsg _ComspecError, 'Fehler: Inhalt von COMSPEC nicht ermittelbar!'
; ---------------------------
; Variablen
_Comspec db 7,'COMSPEC' ; Name der Variable
db ' = ' ; (für die Ausgabe)
_ComspecPuffer db 65 dup ' ' ; Puffer für den Inhalt der Variable
enventry db 256 dup 0 ; Puffer für einen Eintrag aus dem Environment
; ----------------------------
start:
call ShowLogo ; Logo ausgeben und Speicherblock verkleinern
TestDOSVersion 3,0 ; DOS-Version überprüfen
call EnvCount ; Routinen und Tabellen initialisieren
call ShowLokalEnvironment
call ShowPause
jc >l9
call ShowCallerEnvironment
call ShowPause
jc >l9
call ShowCommandEnvironment
call ShowPause
jc >l9
call CheckSetRoutine
jc >l9
call ShowPause
jc >l9
call ReleaseLokalEnv
l9:
EndProcess 0
; ------------------
; CheckSetRoutine
;
; Funktion: Demonstriert die Routine SetEnvVar
;
OldVar db 7,'COMSPEC' ; Name der Variable die gelöscht wird
LeerString db 0 ; Dummystring zum Löschen einer Variable
ChangeVar db 4,'PATH' ; Name der Variablen die geändert wird
NewPath db 8,'Testpfad' ; Neuer Inhalt für die geänderte Variable
NewVar1 db 4,'TEST' ; Name der Variable die erstellt werden soll
NewVarInh1 db 12,'abcdefghijkl'; Inhalt der neuen Variable
NewVar2 db 5,'Test1' ; Name der neuen Variable
NewVarInh2 db 4,'abcd' ; Inhalt der neuen Variable
CheckMSG0 db CR,LF
db 'Erstelle die Variable "TEST" im lokalen Environment mit dem '
db 'Inhalt abcdefghijkl'
db CR,LF
db '(Sollte eigentlich nicht gehen, da der Eintrag mehr als 16 Byte lang ist!)'
db CR,LF
GETLENGTH CheckMSG0
MakeMsg CheckMSG1, CR,LF, 'Lösche die Variable "COMSPEC" im lokalen Environment'
CheckMSG2 db CR,LF
db 'Erstelle die Variable "TEST1" im lokalen Environment mit dem '
db 'Inhalt abcd'
db CR,LF
db '(muß nun möglich sein!)'
db CR,LF
db CR,LF
GETLENGTH CheckMSG2
MakeMsg CheckMSG3, CR,LF, 'Setze die Variable "PATH" im lokalen Environment auf "Testpfad"'
MakeMsg CheckError1, 'Fehler: Variable "TEST" konnte nicht erstellt werden!'
MakeMsg CheckError2, 'Fehler: Variable "COMSPEC" konnte nicht gelöscht werden!'
MakeMsg CheckError3, 'Fehler: Variable "TEST1" konnte nicht erstellt werden!'
MakeMsg CheckError4, 'Fehler: Variable "PATH" kann nicht geändert werden!'
CheckSetRoutine:
mov al,0 ; auf lokales Environment umschalten
call UseOtherEnv
jnc >l1
; Fehler: lokales Environment nicht nutzbar
WRITE_STRING _lokalError
ret
l1:
WRITE_STRING CheckMSG0
; Erstellen der Variable TEST
mov si,offset NewVar1
mov di,offset NewVarInh1
call SetEnvVar
jnc >l1
; Fehler beim Erstellen
WRITE_STRING CheckError1
l1:
WRITE_STRING CheckMSG1
; Löschen der Variable COMSPEC
mov si,offset OldVar
mov di,offset LeerString
call SetEnvVar
jnc >l1
; Fehler beim Löschen
WRITE_STRING CheckError2
l1:
WRITE_STRING CheckMsg3
; Ändern der Variable PATH
mov si,offset ChangeVar
mov di,offset NewPath
call SetEnvVar
jnc >l1
; Fehler beim Ändern der Variable
WRITE_STRING CheckError4
l1:
WRITE_STRING CheckMSG2
; Erstellen der Variable TEST1
mov si,offset NewVar2
mov di,offset NewVarInh2
call SetEnvVar
jnc >l1
; Fehler beim Erstellen
WRITE_STRING CheckError3
l1:
call ShowPause
jc >l9
; und nochmal das lokale Environment anzeigen
call ShowLokalEnvironment
clc
l9:
ret
; ------------------
; RelelaseLokalEnv
;
; Funktion: Freigabe des lokalen Environments
;
ReleaseLokalEnv: ; lokales Environment freigeben
WRITE_STRING _releaseEnv
call FreeLokalEnv
jnc >l1
; Fehler: Environment konnte nicht freigegeben
; werden
WRITE_STRING _releaseError
l1:
ret
; ----------------------------
; ShowLokalEnvironment
;
; Funktion: Ausgabe der Daten des lokalen Environments
;
ShowLokalEnvironment:
mov al,0 ; auf lokales Environment umschalten
call UseOtherEnv
jnc >l1
; Fehler: lokales Environment nicht nutzbar
WRITE_STRING _lokalError
jmp ret
l1: ; Daten des lokalen Environments ausgeben
call EnvCount ; Anzahl Einträge eintragen
mov di,offset _lokalEnvCount
call Konvert_AL_To_Dezstring
; Segment-Adresse eintragen
mov di,offset _LokalEnvSeg
mov ax,w LokalEnvSeg
call Konvert_AX_To_Hexstring
; Daten eintragen
call GetEnvData
jc >l1
push bx
push cx
mov di,offset _LokalEnvLength
call Konvert_AX_To_Dezstring
pop ax
mov di,offset _LokalEnvFree
call Konvert_AX_To_Dezstring
pop ax
mov di,offset _LokalEnvUsed
call Konvert_AX_To_Dezstring
l1:
; Programm-Name ermitteln
mov di,offset _progname-1
push w[di]
call GetProgName
pop ax
mov [di],al
; Statistik ausgeben
WRITE_STRING _LokalEnvMSG
call ShowEntrys ; Einträge ausgeben
call ShowCOMSPEC ; Ausgabe des Inhaltes von COMSPEC in diesem
; Environment
l9:
ret
; ----------------------------
; ShowCallerEnvironment
;
; Funktion: Ausgabe der Daten des Environments des Aufrufers
;
ShowCallerEnvironment:
mov al,1 ; auf Environment des Aufrufers umschalten
call UseOtherEnv
jnc >l1
; Fehler: Environment nicht nutzbar
WRITE_STRING _callerError
jmp >l9
l1: ; Daten des Environments ausgeben
call EnvCount ; Anzahl Einträge eintragen
mov di,offset _callerEnvCount
call Konvert_AL_To_Dezstring
; Segment-Adresse eintragen
mov di,offset _callerEnvSeg
mov ax,w CallerEnvSeg
call Konvert_AX_To_Hexstring
; Daten eintragen
call GetEnvData
jc >l1
push bx
push cx
mov di,offset _CallerEnvLength
call Konvert_AX_To_Dezstring
pop ax
mov di,offset _CallerEnvFree
call Konvert_AX_To_Dezstring
pop ax
mov di,offset _CallerEnvUsed
call Konvert_AX_To_Dezstring
l1:
; Name des Aufrufers ermitteln
mov di,offset _callerName-1
mov al,[di] ; Längenzähler wird hier nicht gebraucht
push ax
call GetCallerName
pop ax
mov [di],al
jc >l1 ; Fehler
jnz >l1 ; Name eingetragen, okay
; Name nicht ermittelbar
inc di
mov si,offset _CommandMSG
mov cx,_CommandMSG_LENGTH
cld
rep movsb
l1: ; Statistik ausgeben
WRITE_STRING _callerEnvMSG
call ShowEntrys ; Einträge ausgeben
call ShowCOMSPEC ; Ausgabe des Inhaltes von COMSPEC in diesem
; Environment
l9:
ret
; ----------------------------
; ShowCommandEnvironment
;
; Funktion: Ausgabe der Daten des Environment des COMMAND.COM
;
ShowCommandEnvironment:
mov al,2 ; auf Environment des COMMAND.COM umschalten
call UseOtherEnv
jnc >l1
; Fehler: Environment nicht nutzbar
WRITE_STRING _commandError
jmp >l9
l1: ; Daten des Environments ausgeben
call EnvCount ; Anzahl Einträge eintragen
mov di,offset _commandEnvCount
call Konvert_AL_To_Dezstring
; Segment-Adresse eintragen
mov di,offset _commandEnvSeg
mov ax,w CommandEnvSeg
call Konvert_AX_To_Hexstring
; Daten eintragen
call GetEnvData
jc >l1
push bx
push cx
mov di,offset _CommandEnvLength
call Konvert_AX_To_Dezstring
pop ax
mov di,offset _CommandEnvFree
call Konvert_AX_To_Dezstring
pop ax
mov di,offset _CommandEnvUsed
call Konvert_AX_To_Dezstring
l1:
; Statistik ausgeben
WRITE_STRING _commandEnvMSG
call ShowEntrys ; Einträge ausgeben
call ShowCOMSPEC ; Ausgabe des Inhaltes von COMSPEC in diesem
; Environment
l9:
ret
; ----------------------------
; ShowComspec
;
; Funktion: Ausgabe des Inhaltes von COMSPEC im akt. Environment
;
ShowComspec:
WRITE_STRING _ComspecMSG
mov si,offset _Comspec
mov di,offset _ComspecPuffer-1
mov cl,[di] ; Längenbyte wird nur temporär benötigt
call SearchEnvStr
xchg cl,[di] ; CL = Länge des Inhaltes von COMSPEC
jnc >l1
or cl,cl
jnz >l1
; Fehler: Inhalt der Variablen nicht ermittelbar
WRITE_STRING _ComspecError
jmp >l9
l1:
mov dx,offset _Comspec+1
add cl,[_comspec]
add cl,3
xor ch,ch ; CX = Länge des gesamten Eintrages
mov bx,01h
mov ah,40h
int 021h
call ShowCR_LF
l9:
ret
; ----------------------------
; ShowEntrys
;
; Funktion: Ausgabe aller Einträge des akt. Environemnts
;
ShowEntrys:
call EnvCount
xor ah,ah ; AX = Anzahl der Einträge
mov cx,ax ; CX = Anzahl der Einträge
mov al,1 ; AX = Nummer des akt. Eintrages
l0:
push ax,cx
mov di,offset enventry
call EnvStr ; Eintrag ermitteln
mov dx,di ; (= String mit Längenzähler!)
inc dx
mov cl,[di]
xor ch,ch
mov ah,040h
mov bx,01h
int 021h
call ShowCR_LF
pop cx,ax
inc ax
cmp ax,cx
IF be jmp l0
ret